<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Flow: flow::net_flow::Congestion_control_classic_with_bandwidth_est Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr id="projectrow">
  <td id="projectalign">
   <div id="projectname">Flow<span id="projectnumber">&#160;2.0.0</span>
   </div>
   <div id="projectbrief">Flow project: Full implementation reference.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="namespaceflow.html">flow</a></li><li class="navelem"><a class="el" href="namespaceflow_1_1net__flow.html">net_flow</a></li><li class="navelem"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html">Congestion_control_classic_with_bandwidth_est</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="summary">
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="#pri-methods">Private Member Functions</a> &#124;
<a href="#pri-attribs">Private Attributes</a> &#124;
<a href="#pri-static-attribs">Static Private Attributes</a> &#124;
<a href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est-members.html">List of all members</a>  </div>
  <div class="headertitle"><div class="title">flow::net_flow::Congestion_control_classic_with_bandwidth_est Class Reference</div></div>
</div><!--header-->
<div class="contents">

<p>Classic congestion control but with backoff to bandwidth estimate-based pipe size.  
 <a href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#details">More...</a></p>

<p><code>#include &lt;<a class="el" href="cong__ctl__classic__bw_8hpp_source.html">cong_ctl_classic_bw.hpp</a>&gt;</code></p>
<div class="dynheader">
Inheritance diagram for flow::net_flow::Congestion_control_classic_with_bandwidth_est:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est__inherit__graph.svg" width="487" height="203"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
<div class="dynheader">
Collaboration diagram for flow::net_flow::Congestion_control_classic_with_bandwidth_est:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est__coll__graph.svg" width="1507" height="594"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:ad0090c57a7877701be584c006c9db329"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#ad0090c57a7877701be584c006c9db329">Congestion_control_classic_with_bandwidth_est</a> (<a class="el" href="classflow_1_1log_1_1Logger.html">log::Logger</a> *logger_ptr, <a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">Peer_socket::Const_ptr</a> sock)</td></tr>
<tr class="memdesc:ad0090c57a7877701be584c006c9db329"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs object by setting up logging and saving a pointer to the containing <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a>.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#ad0090c57a7877701be584c006c9db329">More...</a><br /></td></tr>
<tr class="separator:ad0090c57a7877701be584c006c9db329"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af49a3fe6d8bb1ec32ac245faed17e842"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#af49a3fe6d8bb1ec32ac245faed17e842">congestion_window_bytes</a> () const override</td></tr>
<tr class="memdesc:af49a3fe6d8bb1ec32ac245faed17e842"><td class="mdescLeft">&#160;</td><td class="mdescRight">Implements <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a2b9a554ac60d9fe9d6faf32433c61c86" title="Returns the maximal number of bytes (with respect to m_data field of DATA packets) that this socket s...">Congestion_control_strategy::congestion_window_bytes()</a> API.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#af49a3fe6d8bb1ec32ac245faed17e842">More...</a><br /></td></tr>
<tr class="separator:af49a3fe6d8bb1ec32ac245faed17e842"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a8d0e32a67aa333ab15a5b166a2913260"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a8d0e32a67aa333ab15a5b166a2913260">on_individual_ack</a> (const <a class="el" href="namespaceflow.html#a48799f1263cdeedec125be51a3db2b79">Fine_duration</a> &amp;packet_rtt, const size_t bytes, const size_t sent_cwnd_bytes) override</td></tr>
<tr class="memdesc:a8d0e32a67aa333ab15a5b166a2913260"><td class="mdescLeft">&#160;</td><td class="mdescRight">Implements <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#ab5a942e2097cbad4ec8ea152d40ed88a" title="Informs the congestion control strategy that exactly 1 previously sent packet whose status was In-fli...">Congestion_control_strategy::on_individual_ack()</a> API.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a8d0e32a67aa333ab15a5b166a2913260">More...</a><br /></td></tr>
<tr class="separator:a8d0e32a67aa333ab15a5b166a2913260"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a83ee8438d6033c26a6af03b9dd173dc3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a83ee8438d6033c26a6af03b9dd173dc3">on_acks</a> (size_t bytes, size_t packets) override</td></tr>
<tr class="memdesc:a83ee8438d6033c26a6af03b9dd173dc3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Implements <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a832c2c5f72635ef0d5716a9198fd16d4" title="Informs the congestion control strategy that 1 or more previously sent packets whose status was In-fl...">Congestion_control_strategy::on_acks()</a> API.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a83ee8438d6033c26a6af03b9dd173dc3">More...</a><br /></td></tr>
<tr class="separator:a83ee8438d6033c26a6af03b9dd173dc3"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a942ce2561d6d2bbbb8faa8160a772416"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a942ce2561d6d2bbbb8faa8160a772416">on_loss_event</a> (size_t bytes, size_t packets) override</td></tr>
<tr class="memdesc:a942ce2561d6d2bbbb8faa8160a772416"><td class="mdescLeft">&#160;</td><td class="mdescRight">Implements <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a238eb8f69e309e354d3fbc1c3017f614" title="Informs the congestion control strategy that 1 or more previously sent packets whose status was In-fl...">Congestion_control_strategy::on_loss_event()</a> API.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a942ce2561d6d2bbbb8faa8160a772416">More...</a><br /></td></tr>
<tr class="separator:a942ce2561d6d2bbbb8faa8160a772416"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3358f8b8700d5427a5163f2f480b2e8d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a3358f8b8700d5427a5163f2f480b2e8d">on_drop_timeout</a> (size_t bytes, size_t packets) override</td></tr>
<tr class="memdesc:a3358f8b8700d5427a5163f2f480b2e8d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Implements <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#af7543a12c99ea8d31374b064fdf13d2b" title="Informs the congestion control strategy that 1 or more previously sent packets whose status was In-fl...">Congestion_control_strategy::on_drop_timeout()</a> API.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a3358f8b8700d5427a5163f2f480b2e8d">More...</a><br /></td></tr>
<tr class="separator:a3358f8b8700d5427a5163f2f480b2e8d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a461064f1ff0303cded61131df593599a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a461064f1ff0303cded61131df593599a">on_idle_timeout</a> () override</td></tr>
<tr class="memdesc:a461064f1ff0303cded61131df593599a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Implements <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a6cecbb76a9e837824c0b820e7cc1b3b7" title="Informs the congestion control strategy that Node considers the connection to be &quot;idle&quot; by virtue of ...">Congestion_control_strategy::on_idle_timeout()</a> API.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a461064f1ff0303cded61131df593599a">More...</a><br /></td></tr>
<tr class="separator:a461064f1ff0303cded61131df593599a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a2b9a554ac60d9fe9d6faf32433c61c86"><td class="memItemLeft" align="right" valign="top">virtual size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a2b9a554ac60d9fe9d6faf32433c61c86">congestion_window_bytes</a> () const =0</td></tr>
<tr class="memdesc:a2b9a554ac60d9fe9d6faf32433c61c86"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the maximal number of bytes (with respect to <code>m_data</code> field of DATA packets) that this socket should allow to be In-flight at this time.  <a href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a2b9a554ac60d9fe9d6faf32433c61c86">More...</a><br /></td></tr>
<tr class="separator:a2b9a554ac60d9fe9d6faf32433c61c86"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a832c2c5f72635ef0d5716a9198fd16d4"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a832c2c5f72635ef0d5716a9198fd16d4">on_acks</a> (size_t bytes, size_t packets)</td></tr>
<tr class="memdesc:a832c2c5f72635ef0d5716a9198fd16d4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Informs the congestion control strategy that 1 or more previously sent packets whose status was In-flight just received acknowledgments, thus changing their state from In-flight to Acknowledged.  <a href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a832c2c5f72635ef0d5716a9198fd16d4">More...</a><br /></td></tr>
<tr class="separator:a832c2c5f72635ef0d5716a9198fd16d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a238eb8f69e309e354d3fbc1c3017f614"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a238eb8f69e309e354d3fbc1c3017f614">on_loss_event</a> (size_t bytes, size_t packets)</td></tr>
<tr class="memdesc:a238eb8f69e309e354d3fbc1c3017f614"><td class="mdescLeft">&#160;</td><td class="mdescRight">Informs the congestion control strategy that 1 or more previously sent packets whose status was In-flight have just been inferred to be Dropped by receiving acknowledgments of packets that were sent later than the now-Dropped packets.  <a href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a238eb8f69e309e354d3fbc1c3017f614">More...</a><br /></td></tr>
<tr class="separator:a238eb8f69e309e354d3fbc1c3017f614"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab5a942e2097cbad4ec8ea152d40ed88a"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#ab5a942e2097cbad4ec8ea152d40ed88a">on_individual_ack</a> (const <a class="el" href="namespaceflow.html#a48799f1263cdeedec125be51a3db2b79">Fine_duration</a> &amp;packet_rtt, const size_t bytes, const size_t sent_cwnd_bytes)</td></tr>
<tr class="memdesc:ab5a942e2097cbad4ec8ea152d40ed88a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Informs the congestion control strategy that exactly 1 previously sent packet whose status was In-flight is now known to have the given round trip time (RTT), via acknowledgment.  <a href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#ab5a942e2097cbad4ec8ea152d40ed88a">More...</a><br /></td></tr>
<tr class="separator:ab5a942e2097cbad4ec8ea152d40ed88a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af7543a12c99ea8d31374b064fdf13d2b"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#af7543a12c99ea8d31374b064fdf13d2b">on_drop_timeout</a> (size_t bytes, size_t packets)</td></tr>
<tr class="memdesc:af7543a12c99ea8d31374b064fdf13d2b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Informs the congestion control strategy that 1 or more previously sent packets whose status was In-flight have just been inferred to be Dropped because of the Drop Timer expiring.  <a href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#af7543a12c99ea8d31374b064fdf13d2b">More...</a><br /></td></tr>
<tr class="separator:af7543a12c99ea8d31374b064fdf13d2b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6cecbb76a9e837824c0b820e7cc1b3b7"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a6cecbb76a9e837824c0b820e7cc1b3b7">on_idle_timeout</a> ()</td></tr>
<tr class="memdesc:a6cecbb76a9e837824c0b820e7cc1b3b7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Informs the congestion control strategy that <a class="el" href="classflow_1_1net__flow_1_1Node.html" title="An object of this class is a single Flow-protocol networking node, in the sense that: (1) it has a di...">Node</a> considers the connection to be "idle" by virtue of no desired send activity on the part of the user application for some period of time.  <a href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a6cecbb76a9e837824c0b820e7cc1b3b7">More...</a><br /></td></tr>
<tr class="separator:a6cecbb76a9e837824c0b820e7cc1b3b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="inherit_header pub_methods_classflow_1_1util_1_1Null__interface"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classflow_1_1util_1_1Null__interface')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classflow_1_1util_1_1Null__interface.html">flow::util::Null_interface</a></td></tr>
<tr class="memitem:a5916282577627e424a09884347eddbba inherit pub_methods_classflow_1_1util_1_1Null__interface"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1util_1_1Null__interface.html#a5916282577627e424a09884347eddbba">~Null_interface</a> ()=0</td></tr>
<tr class="memdesc:a5916282577627e424a09884347eddbba inherit pub_methods_classflow_1_1util_1_1Null__interface"><td class="mdescLeft">&#160;</td><td class="mdescRight">Boring <code>virtual</code> destructor.  <a href="classflow_1_1util_1_1Null__interface.html#a5916282577627e424a09884347eddbba">More...</a><br /></td></tr>
<tr class="separator:a5916282577627e424a09884347eddbba inherit pub_methods_classflow_1_1util_1_1Null__interface"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="inherit_header pub_methods_classflow_1_1log_1_1Log__context"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classflow_1_1log_1_1Log__context')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classflow_1_1log_1_1Log__context.html">flow::log::Log_context</a></td></tr>
<tr class="memitem:ae7100d2dd130d8f130e3e64fdb1f4fd9 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#ae7100d2dd130d8f130e3e64fdb1f4fd9">Log_context</a> (<a class="el" href="classflow_1_1log_1_1Logger.html">Logger</a> *logger=0)</td></tr>
<tr class="memdesc:ae7100d2dd130d8f130e3e64fdb1f4fd9 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs <a class="el" href="classflow_1_1log_1_1Log__context.html" title="Convenience class that simply stores a Logger and/or Component passed into a constructor; and returns...">Log_context</a> by storing the given pointer to a <a class="el" href="classflow_1_1log_1_1Logger.html" title="Interface that the user should implement, passing the implementing Logger into logging classes (Flow&#39;...">Logger</a> and a null <a class="el" href="classflow_1_1log_1_1Component.html" title="A light-weight class, each object storing a component payload encoding an enum value from enum type o...">Component</a>.  <a href="classflow_1_1log_1_1Log__context.html#ae7100d2dd130d8f130e3e64fdb1f4fd9">More...</a><br /></td></tr>
<tr class="separator:ae7100d2dd130d8f130e3e64fdb1f4fd9 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af1ac7f30ab442c3c6aa6079335df6c9a inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memTemplParams" colspan="2">template&lt;typename Component_payload &gt; </td></tr>
<tr class="memitem:af1ac7f30ab442c3c6aa6079335df6c9a inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memTemplItemLeft" align="right" valign="top">&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#af1ac7f30ab442c3c6aa6079335df6c9a">Log_context</a> (<a class="el" href="classflow_1_1log_1_1Logger.html">Logger</a> *logger, Component_payload component_payload)</td></tr>
<tr class="memdesc:af1ac7f30ab442c3c6aa6079335df6c9a inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs <a class="el" href="classflow_1_1log_1_1Log__context.html" title="Convenience class that simply stores a Logger and/or Component passed into a constructor; and returns...">Log_context</a> by storing the given pointer to a <a class="el" href="classflow_1_1log_1_1Logger.html" title="Interface that the user should implement, passing the implementing Logger into logging classes (Flow&#39;...">Logger</a> and a new <a class="el" href="classflow_1_1log_1_1Component.html" title="A light-weight class, each object storing a component payload encoding an enum value from enum type o...">Component</a> storing the specified generically typed payload (an <code>enum</code> value).  <a href="classflow_1_1log_1_1Log__context.html#af1ac7f30ab442c3c6aa6079335df6c9a">More...</a><br /></td></tr>
<tr class="separator:af1ac7f30ab442c3c6aa6079335df6c9a inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5c57a7f44959a01ca9a1c948a6686cc0 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#a5c57a7f44959a01ca9a1c948a6686cc0">Log_context</a> (const <a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;src)</td></tr>
<tr class="memdesc:a5c57a7f44959a01ca9a1c948a6686cc0 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy constructor that stores equal <code>Logger*</code> and <a class="el" href="classflow_1_1log_1_1Component.html" title="A light-weight class, each object storing a component payload encoding an enum value from enum type o...">Component</a> values as the source.  <a href="classflow_1_1log_1_1Log__context.html#a5c57a7f44959a01ca9a1c948a6686cc0">More...</a><br /></td></tr>
<tr class="separator:a5c57a7f44959a01ca9a1c948a6686cc0 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3d4e624833d96bdafa1485ffff472509 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#a3d4e624833d96bdafa1485ffff472509">Log_context</a> (<a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;&amp;src)</td></tr>
<tr class="memdesc:a3d4e624833d96bdafa1485ffff472509 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Move constructor that makes this equal to <code>src</code>, while the latter becomes as-if default-constructed.  <a href="classflow_1_1log_1_1Log__context.html#a3d4e624833d96bdafa1485ffff472509">More...</a><br /></td></tr>
<tr class="separator:a3d4e624833d96bdafa1485ffff472509 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5d628315d5a93908d47a281980d3113e inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#a5d628315d5a93908d47a281980d3113e">operator=</a> (const <a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;src)</td></tr>
<tr class="memdesc:a5d628315d5a93908d47a281980d3113e inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Assignment operator that behaves similarly to the copy constructor.  <a href="classflow_1_1log_1_1Log__context.html#a5d628315d5a93908d47a281980d3113e">More...</a><br /></td></tr>
<tr class="separator:a5d628315d5a93908d47a281980d3113e inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aae857197aecba8606c32296bc7bec308 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#aae857197aecba8606c32296bc7bec308">operator=</a> (<a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;&amp;src)</td></tr>
<tr class="memdesc:aae857197aecba8606c32296bc7bec308 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Move assignment operator that behaves similarly to the move constructor.  <a href="classflow_1_1log_1_1Log__context.html#aae857197aecba8606c32296bc7bec308">More...</a><br /></td></tr>
<tr class="separator:aae857197aecba8606c32296bc7bec308 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aa6bb8e4250586425631ef80063caf155 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#aa6bb8e4250586425631ef80063caf155">swap</a> (<a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;other)</td></tr>
<tr class="memdesc:aa6bb8e4250586425631ef80063caf155 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Swaps <a class="el" href="classflow_1_1log_1_1Logger.html" title="Interface that the user should implement, passing the implementing Logger into logging classes (Flow&#39;...">Logger</a> pointers and <a class="el" href="classflow_1_1log_1_1Component.html" title="A light-weight class, each object storing a component payload encoding an enum value from enum type o...">Component</a> objects held by <code>*this</code> and <code>other</code>.  <a href="classflow_1_1log_1_1Log__context.html#aa6bb8e4250586425631ef80063caf155">More...</a><br /></td></tr>
<tr class="separator:aa6bb8e4250586425631ef80063caf155 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af4db395042b065b00398cd59845dcb4d inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classflow_1_1log_1_1Logger.html">Logger</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#af4db395042b065b00398cd59845dcb4d">get_logger</a> () const</td></tr>
<tr class="memdesc:af4db395042b065b00398cd59845dcb4d inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the stored <a class="el" href="classflow_1_1log_1_1Logger.html" title="Interface that the user should implement, passing the implementing Logger into logging classes (Flow&#39;...">Logger</a> pointer, particularly as many <code>FLOW_LOG_*()</code> macros expect.  <a href="classflow_1_1log_1_1Log__context.html#af4db395042b065b00398cd59845dcb4d">More...</a><br /></td></tr>
<tr class="separator:af4db395042b065b00398cd59845dcb4d inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a8a5fef42dc2cedf3c0d1a6e83beb2948 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="classflow_1_1log_1_1Component.html">Component</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#a8a5fef42dc2cedf3c0d1a6e83beb2948">get_log_component</a> () const</td></tr>
<tr class="memdesc:a8a5fef42dc2cedf3c0d1a6e83beb2948 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns reference to the stored <a class="el" href="classflow_1_1log_1_1Component.html" title="A light-weight class, each object storing a component payload encoding an enum value from enum type o...">Component</a> object, particularly as many <code>FLOW_LOG_*()</code> macros expect.  <a href="classflow_1_1log_1_1Log__context.html#a8a5fef42dc2cedf3c0d1a6e83beb2948">More...</a><br /></td></tr>
<tr class="separator:a8a5fef42dc2cedf3c0d1a6e83beb2948 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pri-methods" name="pri-methods"></a>
Private Member Functions</h2></td></tr>
<tr class="memitem:a9650086c28de7e9ed9fdaecaf9f183a6"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a9650086c28de7e9ed9fdaecaf9f183a6">congestion_window_adjusted_bytes</a> () const</td></tr>
<tr class="memdesc:a9650086c28de7e9ed9fdaecaf9f183a6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the best bandwidth/latency-based guess for what the current window (pipe) size should be.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a9650086c28de7e9ed9fdaecaf9f183a6">More...</a><br /></td></tr>
<tr class="separator:a9650086c28de7e9ed9fdaecaf9f183a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pri-attribs" name="pri-attribs"></a>
Private Attributes</h2></td></tr>
<tr class="memitem:aeb3b683eed3fcd8af27323fc747abb03"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html">Congestion_control_classic_data</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#aeb3b683eed3fcd8af27323fc747abb03">m_classic_data</a></td></tr>
<tr class="memdesc:aeb3b683eed3fcd8af27323fc747abb03"><td class="mdescLeft">&#160;</td><td class="mdescRight">The Reno CWND/SSTHRESH-changing engine and CWND/SSTHRESH storage.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#aeb3b683eed3fcd8af27323fc747abb03">More...</a><br /></td></tr>
<tr class="separator:aeb3b683eed3fcd8af27323fc747abb03"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aac8260cf710dc42843a478873ed8b649"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classflow_1_1net__flow_1_1Send__bandwidth__estimator.html#a1e5e59588c6683d56866e49e5fd2980e">Send_bandwidth_estimator::Time_unit</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#aac8260cf710dc42843a478873ed8b649">m_rtt_min</a></td></tr>
<tr class="memdesc:aac8260cf710dc42843a478873ed8b649"><td class="mdescLeft">&#160;</td><td class="mdescRight">The minimum individual packet's RTT observed so far; it should be reset to the next sample if <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a5b3a333ae29bd009cd22919c1e01c19f" title="If true, then when the next RTT measurement comes in, any past measurement should be disregarded,...">m_reset_rtt_min</a> is <code>true</code>, which may happen if our algorithm thinks the pipe has changed drastically, making past measurements useless.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#aac8260cf710dc42843a478873ed8b649">More...</a><br /></td></tr>
<tr class="separator:aac8260cf710dc42843a478873ed8b649"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5b3a333ae29bd009cd22919c1e01c19f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classbool.html">bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a5b3a333ae29bd009cd22919c1e01c19f">m_reset_rtt_min</a></td></tr>
<tr class="memdesc:a5b3a333ae29bd009cd22919c1e01c19f"><td class="mdescLeft">&#160;</td><td class="mdescRight">If <code>true</code>, then when the next RTT measurement comes in, any past measurement should be disregarded, and <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#aac8260cf710dc42843a478873ed8b649" title="The minimum individual packet&#39;s RTT observed so far; it should be reset to the next sample if m_reset...">m_rtt_min</a> should be set to the new measurement.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a5b3a333ae29bd009cd22919c1e01c19f">More...</a><br /></td></tr>
<tr class="separator:a5b3a333ae29bd009cd22919c1e01c19f"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pri-static-attribs" name="pri-static-attribs"></a>
Static Private Attributes</h2></td></tr>
<tr class="memitem:a07b264d895ef7eb343d6d503d12e63d0"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classflow_1_1net__flow_1_1Send__bandwidth__estimator.html#a1e5e59588c6683d56866e49e5fd2980e">Send_bandwidth_estimator::Time_unit</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a07b264d895ef7eb343d6d503d12e63d0">S_INIT_RTT_MIN</a> = boost::chrono::seconds(20)</td></tr>
<tr class="memdesc:a07b264d895ef7eb343d6d503d12e63d0"><td class="mdescLeft">&#160;</td><td class="mdescRight">The initial value for <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#aac8260cf710dc42843a478873ed8b649" title="The minimum individual packet&#39;s RTT observed so far; it should be reset to the next sample if m_reset...">m_rtt_min</a>, until one RTT measurement comes in.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a07b264d895ef7eb343d6d503d12e63d0">More...</a><br /></td></tr>
<tr class="separator:a07b264d895ef7eb343d6d503d12e63d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="inherited" name="inherited"></a>
Additional Inherited Members</h2></td></tr>
<tr class="inherit_header pro_methods_classflow_1_1net__flow_1_1Congestion__control__strategy"><td colspan="2" onclick="javascript:toggleInherit('pro_methods_classflow_1_1net__flow_1_1Congestion__control__strategy')"><img src="closed.png" alt="-"/>&#160;Protected Member Functions inherited from <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html">flow::net_flow::Congestion_control_strategy</a></td></tr>
<tr class="memitem:a0eacd984fd4e7d5ad3c30a59082ac95b inherit pro_methods_classflow_1_1net__flow_1_1Congestion__control__strategy"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a0eacd984fd4e7d5ad3c30a59082ac95b">Congestion_control_strategy</a> (<a class="el" href="classflow_1_1log_1_1Logger.html">log::Logger</a> *logger_ptr, <a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">Peer_socket::Const_ptr</a> sock)</td></tr>
<tr class="memdesc:a0eacd984fd4e7d5ad3c30a59082ac95b inherit pro_methods_classflow_1_1net__flow_1_1Congestion__control__strategy"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs object by setting up logging and saving a pointer to the containing <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a>.  <a href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a0eacd984fd4e7d5ad3c30a59082ac95b">More...</a><br /></td></tr>
<tr class="separator:a0eacd984fd4e7d5ad3c30a59082ac95b inherit pro_methods_classflow_1_1net__flow_1_1Congestion__control__strategy"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3e9786f9e5f170ca23135a2a815bc3f4 inherit pro_methods_classflow_1_1net__flow_1_1Congestion__control__strategy"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">Peer_socket::Const_ptr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a3e9786f9e5f170ca23135a2a815bc3f4">socket</a> () const</td></tr>
<tr class="memdesc:a3e9786f9e5f170ca23135a2a815bc3f4 inherit pro_methods_classflow_1_1net__flow_1_1Congestion__control__strategy"><td class="mdescLeft">&#160;</td><td class="mdescRight">Utility for subclasses that returns a handle to the containing <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a>.  <a href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a3e9786f9e5f170ca23135a2a815bc3f4">More...</a><br /></td></tr>
<tr class="separator:a3e9786f9e5f170ca23135a2a815bc3f4 inherit pro_methods_classflow_1_1net__flow_1_1Congestion__control__strategy"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p >Classic congestion control but with backoff to bandwidth estimate-based pipe size. </p>
<p >Implements <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html" title="The abstract interface for a per-socket module that determines the socket&#39;s congestion control behavi...">Congestion_control_strategy</a> abstract API.</p>
<p >The basic idea is the same as in <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic.html" title="Classic congestion control, based on Reno (TCP RFC 5681), with congestion avoidance,...">Congestion_control_classic</a>. See that class's doc header first. Except where noted below, the algorithm is identical.</p>
<p >The difference is that instead of halving (or otherwise lowering by an arbitrary constant factor) the window, we set the window to a pipe width based on our estimate of the available bandwidth and the inherent latency in the pipe. The latter is tracked by keeping the minimum individual packet RTT observed thus far; the former (bandwidth estimate) is obtained from <a class="el" href="classflow_1_1net__flow_1_1Send__bandwidth__estimator.html" title="A per-Peer_socket module that tries to estimate the bandwidth available to the outgoing flow.">Send_bandwidth_estimator</a>. Normally bandwidth estimation would be inside the congestion control strategy class, but since its results may be useful independently of congestion control, it is a separate module.</p>
<p >The specifics of the implementation are based on Westwood/Westwood+. The part about computing the pipe width based on B * RTTmin comes from the original Westwood paper. The bandwidth estimation algorithm is based on Westwood+ and is discussed in further detail in class <a class="el" href="classflow_1_1net__flow_1_1Send__bandwidth__estimator.html" title="A per-Peer_socket module that tries to estimate the bandwidth available to the outgoing flow.">Send_bandwidth_estimator</a>. The reference implementation is Linux kernel's Westwood+ implementation; see <a class="el" href="classflow_1_1net__flow_1_1Send__bandwidth__estimator.html" title="A per-Peer_socket module that tries to estimate the bandwidth available to the outgoing flow.">Send_bandwidth_estimator</a> doc header for references.</p>
<p >The strength of this algorithm is that it is potentially less timid in the face of random loss as opposed to true congestion, when compared to <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic.html" title="Classic congestion control, based on Reno (TCP RFC 5681), with congestion avoidance,...">Congestion_control_classic</a> (Reno). It won't just halve CWND at the slightest provocation. On the other hand bandwidth estimation seems to, in my tests at least, kind of measure the rate at which we're sending data and less the actual available pipe. Still, at least at lower latencies and loss rates it can greatly outperform <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic.html" title="Classic congestion control, based on Reno (TCP RFC 5681), with congestion avoidance,...">Congestion_control_classic</a>; though at higher such values it can actually be worse (at least in my crude tests &ndash; more formal testing with real simulation TBD).</p>
<dl class="section see"><dt>See also</dt><dd><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic.html" title="Classic congestion control, based on Reno (TCP RFC 5681), with congestion avoidance,...">Congestion_control_classic</a>, <a class="el" href="classflow_1_1net__flow_1_1Send__bandwidth__estimator.html" title="A per-Peer_socket module that tries to estimate the bandwidth available to the outgoing flow.">Send_bandwidth_estimator</a>. </dd></dl>

<p class="definition">Definition at line <a class="el" href="cong__ctl__classic__bw_8hpp_source.html#l00061">61</a> of file <a class="el" href="cong__ctl__classic__bw_8hpp_source.html">cong_ctl_classic_bw.hpp</a>.</p>
</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
<a id="ad0090c57a7877701be584c006c9db329" name="ad0090c57a7877701be584c006c9db329"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad0090c57a7877701be584c006c9db329">&#9670;&nbsp;</a></span>Congestion_control_classic_with_bandwidth_est()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">flow::net_flow::Congestion_control_classic_with_bandwidth_est::Congestion_control_classic_with_bandwidth_est </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classflow_1_1log_1_1Logger.html">log::Logger</a> *&#160;</td>
          <td class="paramname"><em>logger_ptr</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">Peer_socket::Const_ptr</a>&#160;</td>
          <td class="paramname"><em>sock</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Constructs object by setting up logging and saving a pointer to the containing <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a>. </p>
<p >Congestion window is chosen to be some small initial value, and an exponential congestion window growth is set up to continue indefinitely, until a loss event, drop timeout, or idle timeout.</p>
<p >Only a weak pointer of <code>sock</code> is stored: the <code>shared_ptr</code> itself is not saved, so the reference count of <code>sock</code> does not increase. This avoids a circular <code>shared_ptr</code> situation that would arise from <code>*this</code> pointing to <code>sock</code>, and <code>sock</code> pointing to <code>*this</code> (the two objects <em>do</em> need access to each other, as explained in class <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html" title="The abstract interface for a per-socket module that determines the socket&#39;s congestion control behavi...">Congestion_control_strategy</a> doc header).</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">logger_ptr</td><td>The Logger implementation to use subsequently. </td></tr>
    <tr><td class="paramname">sock</td><td>The <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a> for which this module will control congestion policy. </td></tr>
  </table>
  </dd>
</dl>

<p class="definition">Definition at line <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00031">31</a> of file <a class="el" href="cong__ctl__classic__bw_8cpp_source.html">cong_ctl_classic_bw.cpp</a>.</p>

</div>
</div>
<h2 class="groupheader">Member Function Documentation</h2>
<a id="a9650086c28de7e9ed9fdaecaf9f183a6" name="a9650086c28de7e9ed9fdaecaf9f183a6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9650086c28de7e9ed9fdaecaf9f183a6">&#9670;&nbsp;</a></span>congestion_window_adjusted_bytes()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">size_t flow::net_flow::Congestion_control_classic_with_bandwidth_est::congestion_window_adjusted_bytes </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td> const</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Returns the best bandwidth/latency-based guess for what the current window (pipe) size should be. </p>
<dl class="section return"><dt>Returns</dt><dd>A CWND/SSTHRESH-suitable value. </dd></dl>

<p class="definition">Definition at line <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00173">173</a> of file <a class="el" href="cong__ctl__classic__bw_8cpp_source.html">cong_ctl_classic_bw.cpp</a>.</p>

<p class="reference">References <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>, <a class="el" href="cong__ctl__classic__bw_8hpp_source.html#l00194">m_rtt_min</a>, and <a class="el" href="cong__ctl_8cpp_source.html#l00063">flow::net_flow::Congestion_control_strategy::socket()</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00137">on_drop_timeout()</a>, and <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00103">on_loss_event()</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est_a9650086c28de7e9ed9fdaecaf9f183a6_cgraph.svg" width="474" height="59"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>
<div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est_a9650086c28de7e9ed9fdaecaf9f183a6_icgraph.svg" width="506" height="131"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="af49a3fe6d8bb1ec32ac245faed17e842" name="af49a3fe6d8bb1ec32ac245faed17e842"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af49a3fe6d8bb1ec32ac245faed17e842">&#9670;&nbsp;</a></span>congestion_window_bytes()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">size_t flow::net_flow::Congestion_control_classic_with_bandwidth_est::congestion_window_bytes </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td> const</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Implements <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a2b9a554ac60d9fe9d6faf32433c61c86" title="Returns the maximal number of bytes (with respect to m_data field of DATA packets) that this socket s...">Congestion_control_strategy::congestion_window_bytes()</a> API. </p>
<dl class="section return"><dt>Returns</dt><dd>See <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a2b9a554ac60d9fe9d6faf32433c61c86" title="Returns the maximal number of bytes (with respect to m_data field of DATA packets) that this socket s...">Congestion_control_strategy::congestion_window_bytes()</a>. </dd></dl>

<p>Implements <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a2b9a554ac60d9fe9d6faf32433c61c86">flow::net_flow::Congestion_control_strategy</a>.</p>

<p class="definition">Definition at line <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00045">45</a> of file <a class="el" href="cong__ctl__classic__bw_8cpp_source.html">cong_ctl_classic_bw.cpp</a>.</p>

<p class="reference">References <a class="el" href="cong__ctl__util_8cpp_source.html#l00061">flow::net_flow::Congestion_control_classic_data::congestion_window_bytes()</a>, and <a class="el" href="cong__ctl__classic__bw_8hpp_source.html#l00187">m_classic_data</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est_af49a3fe6d8bb1ec32ac245faed17e842_cgraph.svg" width="464" height="59"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="a83ee8438d6033c26a6af03b9dd173dc3" name="a83ee8438d6033c26a6af03b9dd173dc3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a83ee8438d6033c26a6af03b9dd173dc3">&#9670;&nbsp;</a></span>on_acks()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Congestion_control_classic_with_bandwidth_est::on_acks </td>
          <td>(</td>
          <td class="paramtype">size_t&#160;</td>
          <td class="paramname"><em>bytes</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">size_t&#160;</td>
          <td class="paramname"><em>packets</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Implements <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a832c2c5f72635ef0d5716a9198fd16d4" title="Informs the congestion control strategy that 1 or more previously sent packets whose status was In-fl...">Congestion_control_strategy::on_acks()</a> API. </p>
<p >Congestion window grows either linearly (in congestion avoidance mode) or exponentially (in slow start mode). There is no congestion avoidance mode until at least one of <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a942ce2561d6d2bbbb8faa8160a772416" title="Implements Congestion_control_strategy::on_loss_event() API.">on_loss_event()</a> or <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a3358f8b8700d5427a5163f2f480b2e8d" title="Implements Congestion_control_strategy::on_drop_timeout() API.">on_drop_timeout()</a> occurs; at least until then slow start is in effect.</p>
<p >Additional <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a> state used: none.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">bytes</td><td>See <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a832c2c5f72635ef0d5716a9198fd16d4" title="Informs the congestion control strategy that 1 or more previously sent packets whose status was In-fl...">Congestion_control_strategy::on_acks()</a>. </td></tr>
    <tr><td class="paramname">packets</td><td>See <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a832c2c5f72635ef0d5716a9198fd16d4" title="Informs the congestion control strategy that 1 or more previously sent packets whose status was In-fl...">Congestion_control_strategy::on_acks()</a>. </td></tr>
  </table>
  </dd>
</dl>

<p>Reimplemented from <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a832c2c5f72635ef0d5716a9198fd16d4">flow::net_flow::Congestion_control_strategy</a>.</p>

<p class="definition">Definition at line <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00096">96</a> of file <a class="el" href="cong__ctl__classic__bw_8cpp_source.html">cong_ctl_classic_bw.cpp</a>.</p>

<p class="reference">References <a class="el" href="cong__ctl__classic__bw_8hpp_source.html#l00187">m_classic_data</a>, and <a class="el" href="cong__ctl__util_8cpp_source.html#l00076">flow::net_flow::Congestion_control_classic_data::on_acks()</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est_a83ee8438d6033c26a6af03b9dd173dc3_cgraph.svg" width="931" height="272"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="a3358f8b8700d5427a5163f2f480b2e8d" name="a3358f8b8700d5427a5163f2f480b2e8d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a3358f8b8700d5427a5163f2f480b2e8d">&#9670;&nbsp;</a></span>on_drop_timeout()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Congestion_control_classic_with_bandwidth_est::on_drop_timeout </td>
          <td>(</td>
          <td class="paramtype">size_t&#160;</td>
          <td class="paramname"><em>bytes</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">size_t&#160;</td>
          <td class="paramname"><em>packets</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Implements <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#af7543a12c99ea8d31374b064fdf13d2b" title="Informs the congestion control strategy that 1 or more previously sent packets whose status was In-fl...">Congestion_control_strategy::on_drop_timeout()</a> API. </p>
<p >Congestion window is set to a low value, while the next slow start session is set to end at a pipe width based on the estimation of the available outgoing bandwidth. Thus a slow start session, most likely, begins.</p>
<p >Internally this also may affect our gauge of the "true" latency of the pipe.</p>
<p >Additional <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a> state used: none.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">bytes</td><td>See <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#af7543a12c99ea8d31374b064fdf13d2b" title="Informs the congestion control strategy that 1 or more previously sent packets whose status was In-fl...">Congestion_control_strategy::on_drop_timeout()</a>. </td></tr>
    <tr><td class="paramname">packets</td><td>See <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#af7543a12c99ea8d31374b064fdf13d2b" title="Informs the congestion control strategy that 1 or more previously sent packets whose status was In-fl...">Congestion_control_strategy::on_drop_timeout()</a>. </td></tr>
  </table>
  </dd>
</dl>

<p>Reimplemented from <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#af7543a12c99ea8d31374b064fdf13d2b">flow::net_flow::Congestion_control_strategy</a>.</p>

<p class="definition">Definition at line <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00137">137</a> of file <a class="el" href="cong__ctl__classic__bw_8cpp_source.html">cong_ctl_classic_bw.cpp</a>.</p>

<p class="reference">References <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00173">congestion_window_adjusted_bytes()</a>, <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>, <a class="el" href="cong__ctl__classic__bw_8hpp_source.html#l00187">m_classic_data</a>, <a class="el" href="cong__ctl__classic__bw_8hpp_source.html#l00201">m_reset_rtt_min</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00293">flow::net_flow::Congestion_control_classic_data::on_drop_timeout()</a>, and <a class="el" href="cong__ctl_8cpp_source.html#l00063">flow::net_flow::Congestion_control_strategy::socket()</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est_a3358f8b8700d5427a5163f2f480b2e8d_cgraph.svg" width="1192" height="300"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="a461064f1ff0303cded61131df593599a" name="a461064f1ff0303cded61131df593599a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a461064f1ff0303cded61131df593599a">&#9670;&nbsp;</a></span>on_idle_timeout()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Congestion_control_classic_with_bandwidth_est::on_idle_timeout </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Implements <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a6cecbb76a9e837824c0b820e7cc1b3b7" title="Informs the congestion control strategy that Node considers the connection to be &quot;idle&quot; by virtue of ...">Congestion_control_strategy::on_idle_timeout()</a> API. </p>
<p >Congestion window is set to a low value. Thus a slow start session begins.</p>
<p >Additional <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a> state used: none. </p>

<p>Reimplemented from <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a6cecbb76a9e837824c0b820e7cc1b3b7">flow::net_flow::Congestion_control_strategy</a>.</p>

<p class="definition">Definition at line <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00209">209</a> of file <a class="el" href="cong__ctl__classic__bw_8cpp_source.html">cong_ctl_classic_bw.cpp</a>.</p>

<p class="reference">References <a class="el" href="cong__ctl__classic__bw_8hpp_source.html#l00187">m_classic_data</a>, and <a class="el" href="cong__ctl__util_8cpp_source.html#l00312">flow::net_flow::Congestion_control_classic_data::on_idle_timeout()</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est_a461064f1ff0303cded61131df593599a_cgraph.svg" width="1111" height="208"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="a8d0e32a67aa333ab15a5b166a2913260" name="a8d0e32a67aa333ab15a5b166a2913260"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8d0e32a67aa333ab15a5b166a2913260">&#9670;&nbsp;</a></span>on_individual_ack()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Congestion_control_classic_with_bandwidth_est::on_individual_ack </td>
          <td>(</td>
          <td class="paramtype">const <a class="el" href="namespaceflow.html#a48799f1263cdeedec125be51a3db2b79">Fine_duration</a> &amp;&#160;</td>
          <td class="paramname"><em>packet_rtt</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const size_t&#160;</td>
          <td class="paramname"><em>bytes</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const size_t&#160;</td>
          <td class="paramname"><em>sent_cwnd_bytes</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Implements <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#ab5a942e2097cbad4ec8ea152d40ed88a" title="Informs the congestion control strategy that exactly 1 previously sent packet whose status was In-fli...">Congestion_control_strategy::on_individual_ack()</a> API. </p>
<p >This results in no <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#af49a3fe6d8bb1ec32ac245faed17e842" title="Implements Congestion_control_strategy::congestion_window_bytes() API.">congestion_window_bytes()</a> change but may affect its later values.</p>
<p >Internally this gauges the "true" latency of the pipe.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">packet_rtt</td><td>See <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#ab5a942e2097cbad4ec8ea152d40ed88a" title="Informs the congestion control strategy that exactly 1 previously sent packet whose status was In-fli...">Congestion_control_strategy::on_individual_ack()</a>. </td></tr>
    <tr><td class="paramname">bytes</td><td>See <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#ab5a942e2097cbad4ec8ea152d40ed88a" title="Informs the congestion control strategy that exactly 1 previously sent packet whose status was In-fli...">Congestion_control_strategy::on_individual_ack()</a>. </td></tr>
    <tr><td class="paramname">sent_cwnd_bytes</td><td>See <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#ab5a942e2097cbad4ec8ea152d40ed88a" title="Informs the congestion control strategy that exactly 1 previously sent packet whose status was In-fli...">Congestion_control_strategy::on_individual_ack()</a>. </td></tr>
  </table>
  </dd>
</dl>

<p>Reimplemented from <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#ab5a942e2097cbad4ec8ea152d40ed88a">flow::net_flow::Congestion_control_strategy</a>.</p>

<p class="definition">Definition at line <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00050">50</a> of file <a class="el" href="cong__ctl__classic__bw_8cpp_source.html">cong_ctl_classic_bw.cpp</a>.</p>

<p class="reference">References <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>, <a class="el" href="cong__ctl__classic__bw_8hpp_source.html#l00201">m_reset_rtt_min</a>, <a class="el" href="cong__ctl__classic__bw_8hpp_source.html#l00194">m_rtt_min</a>, and <a class="el" href="cong__ctl_8cpp_source.html#l00063">flow::net_flow::Congestion_control_strategy::socket()</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est_a8d0e32a67aa333ab15a5b166a2913260_cgraph.svg" width="424" height="59"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="a942ce2561d6d2bbbb8faa8160a772416" name="a942ce2561d6d2bbbb8faa8160a772416"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a942ce2561d6d2bbbb8faa8160a772416">&#9670;&nbsp;</a></span>on_loss_event()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Congestion_control_classic_with_bandwidth_est::on_loss_event </td>
          <td>(</td>
          <td class="paramtype">size_t&#160;</td>
          <td class="paramname"><em>bytes</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">size_t&#160;</td>
          <td class="paramname"><em>packets</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Implements <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a238eb8f69e309e354d3fbc1c3017f614" title="Informs the congestion control strategy that 1 or more previously sent packets whose status was In-fl...">Congestion_control_strategy::on_loss_event()</a> API. </p>
<p >Congestion window changes (probably drops) to a value based on the estimation of the available outgoing bandwidth, and the next slow start (if any, e.g., on a later Drop Timeout) will end once the congestion window exceeds this value. Thus after this call congestion avoidance mode begins anew.</p>
<p >Additional <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a> state used: none.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">bytes</td><td>See <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a238eb8f69e309e354d3fbc1c3017f614" title="Informs the congestion control strategy that 1 or more previously sent packets whose status was In-fl...">Congestion_control_strategy::on_loss_event()</a>. </td></tr>
    <tr><td class="paramname">packets</td><td>See <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a238eb8f69e309e354d3fbc1c3017f614" title="Informs the congestion control strategy that 1 or more previously sent packets whose status was In-fl...">Congestion_control_strategy::on_loss_event()</a>. </td></tr>
  </table>
  </dd>
</dl>

<p>Reimplemented from <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a238eb8f69e309e354d3fbc1c3017f614">flow::net_flow::Congestion_control_strategy</a>.</p>

<p class="definition">Definition at line <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00103">103</a> of file <a class="el" href="cong__ctl__classic__bw_8cpp_source.html">cong_ctl_classic_bw.cpp</a>.</p>

<p class="reference">References <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00173">congestion_window_adjusted_bytes()</a>, <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>, <a class="el" href="cong__ctl__classic__bw_8hpp_source.html#l00187">m_classic_data</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00228">flow::net_flow::Congestion_control_classic_data::on_congestion_event()</a>, and <a class="el" href="cong__ctl_8cpp_source.html#l00063">flow::net_flow::Congestion_control_strategy::socket()</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est_a942ce2561d6d2bbbb8faa8160a772416_cgraph.svg" width="978" height="232"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<h2 class="groupheader">Member Data Documentation</h2>
<a id="aeb3b683eed3fcd8af27323fc747abb03" name="aeb3b683eed3fcd8af27323fc747abb03"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aeb3b683eed3fcd8af27323fc747abb03">&#9670;&nbsp;</a></span>m_classic_data</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html">Congestion_control_classic_data</a> flow::net_flow::Congestion_control_classic_with_bandwidth_est::m_classic_data</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>The Reno CWND/SSTHRESH-changing engine and CWND/SSTHRESH storage. </p>

<p class="definition">Definition at line <a class="el" href="cong__ctl__classic__bw_8hpp_source.html#l00187">187</a> of file <a class="el" href="cong__ctl__classic__bw_8hpp_source.html">cong_ctl_classic_bw.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00045">congestion_window_bytes()</a>, <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00096">on_acks()</a>, <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00137">on_drop_timeout()</a>, <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00209">on_idle_timeout()</a>, and <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00103">on_loss_event()</a>.</p>

</div>
</div>
<a id="a5b3a333ae29bd009cd22919c1e01c19f" name="a5b3a333ae29bd009cd22919c1e01c19f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5b3a333ae29bd009cd22919c1e01c19f">&#9670;&nbsp;</a></span>m_reset_rtt_min</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classbool.html">bool</a> flow::net_flow::Congestion_control_classic_with_bandwidth_est::m_reset_rtt_min</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>If <code>true</code>, then when the next RTT measurement comes in, any past measurement should be disregarded, and <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#aac8260cf710dc42843a478873ed8b649" title="The minimum individual packet&#39;s RTT observed so far; it should be reset to the next sample if m_reset...">m_rtt_min</a> should be set to the new measurement. </p>
<p >Do this if the pipe may have drastically changed, obsoleting any prior observations. </p>

<p class="definition">Definition at line <a class="el" href="cong__ctl__classic__bw_8hpp_source.html#l00201">201</a> of file <a class="el" href="cong__ctl__classic__bw_8hpp_source.html">cong_ctl_classic_bw.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00137">on_drop_timeout()</a>, and <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00051">on_individual_ack()</a>.</p>

</div>
</div>
<a id="aac8260cf710dc42843a478873ed8b649" name="aac8260cf710dc42843a478873ed8b649"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aac8260cf710dc42843a478873ed8b649">&#9670;&nbsp;</a></span>m_rtt_min</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classflow_1_1net__flow_1_1Send__bandwidth__estimator.html#a1e5e59588c6683d56866e49e5fd2980e">Send_bandwidth_estimator::Time_unit</a> flow::net_flow::Congestion_control_classic_with_bandwidth_est::m_rtt_min</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>The minimum individual packet's RTT observed so far; it should be reset to the next sample if <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#a5b3a333ae29bd009cd22919c1e01c19f" title="If true, then when the next RTT measurement comes in, any past measurement should be disregarded,...">m_reset_rtt_min</a> is <code>true</code>, which may happen if our algorithm thinks the pipe has changed drastically, making past measurements useless. </p>

<p class="definition">Definition at line <a class="el" href="cong__ctl__classic__bw_8hpp_source.html#l00194">194</a> of file <a class="el" href="cong__ctl__classic__bw_8hpp_source.html">cong_ctl_classic_bw.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00173">congestion_window_adjusted_bytes()</a>, and <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00051">on_individual_ack()</a>.</p>

</div>
</div>
<a id="a07b264d895ef7eb343d6d503d12e63d0" name="a07b264d895ef7eb343d6d503d12e63d0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a07b264d895ef7eb343d6d503d12e63d0">&#9670;&nbsp;</a></span>S_INIT_RTT_MIN</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">const <a class="el" href="classflow_1_1net__flow_1_1Send__bandwidth__estimator.html#a1e5e59588c6683d56866e49e5fd2980e">Send_bandwidth_estimator::Time_unit</a> flow::net_flow::Congestion_control_classic_with_bandwidth_est::S_INIT_RTT_MIN = boost::chrono::seconds(20)</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>The initial value for <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html#aac8260cf710dc42843a478873ed8b649" title="The minimum individual packet&#39;s RTT observed so far; it should be reset to the next sample if m_reset...">m_rtt_min</a>, until one RTT measurement comes in. </p>
<p >Initialize to conservatively large value. I considered making this configurable, but it doesn't seem worth it, as we'll get a real RTT sample with the very first ACK that arrives. Also the Linux <code>tcp_westwood.c</code> reference implementation does the same thing (a hard constant). </p>

<p class="definition">Definition at line <a class="el" href="cong__ctl__classic__bw_8hpp_source.html#l00182">182</a> of file <a class="el" href="cong__ctl__classic__bw_8hpp_source.html">cong_ctl_classic_bw.hpp</a>.</p>

</div>
</div>
<hr/>The documentation for this class was generated from the following files:<ul>
<li>net_flow/detail/cong_ctl/<a class="el" href="cong__ctl__classic__bw_8hpp_source.html">cong_ctl_classic_bw.hpp</a></li>
<li>net_flow/detail/cong_ctl/<a class="el" href="cong__ctl__classic__bw_8cpp_source.html">cong_ctl_classic_bw.cpp</a></li>
</ul>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Mar 28 2025 22:55:35 for Flow by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4
</small></address>
</body>
</html>
